<?php

class SudokuController extends Controller
{
	private $L=array();
	private $R=array();
	private $U=array();
	private $D=array();
	private $S=array();
	private $nRow=array();
	private $nCol=array();
	private $head=array();
	private $cnt=0;
	private $map=array();
	/**
	 * Declares class-based actions.
	 */
	public $layout="//layouts/main";
	public function actions()
	{
	}

	/**
	 * This is the default 'index' action that is invoked
	 * when an action is not explicitly requested by users.
	 */
	public function actionIndex()
	{
		$this->pageTitle ="Sudoku";
		if (empty(Yii::app()->user->id))
		{
			$this->redirect(array('site/loginPage'));
		}else{
			if (!isset($_GET['status']))
			{
				$this->render('index');
			}
			else
			{
				$this->render('viewsudoku');
			}
		}
	}

	/**
	 * This is the action to handle external exceptions.
	 */
	public function actionError()
	{
		if($error=Yii::app()->errorHandler->error)
		{
			if(Yii::app()->request->isAjaxRequest)
				echo $error['message'];
			else
				$this->render('error', array('error'=>$error['message']));
		}
	}
	
	public function getMenu()
	{
		$menu='';
		$menuHead='<ul class="nav navbar-nav">';
		$messageMenu='<li class="dropdown">
			<a href="#" class="dropdown-toggle active" data-toggle="dropdown"><span class="badge"></span>我的数独<b class="caret"></b></a>
			<ul class="dropdown-menu">
				<li><a href="'.(Yii::app()->request->baseUrl).'/sudoku/fighting">正在激战<span class="badge"></span></a></li>
				<li><a href="'.(Yii::app()->request->baseUrl).'/sudoku/sudokulistpage">狙击名单</a></li>
				<li><a href="'.(Yii::app()->request->baseUrl).'/sudoku/randomgame">随机来一把</a></li>
				<li><a href="'.(Yii::app()->request->baseUrl).'/sudoku/solve">给Wo出个难题</a></li>
			</ul>
		</li>';
		
		$systemMenu='<li class="dropdown">
			<a href="#" class="dropdown-toggle" data-toggle="dropdown">系统管理<b class="caret"></b></a>
			<ul class="dropdown-menu">
				<li><a href="'.(Yii::app()->request->baseUrl).'/site/usermanagepage">用户管理</a></li>
				<li><a href="'.(Yii::app()->request->baseUrl).'/sudoku/sudokumanagepage">数独管理</a></li>
			</ul>
		</li>';
		
		$userMenu=
		'<ul class="nav navbar-nav navbar-right">
				<li class="dropdown">
					<a href="#" class="dropdown-toggle" data-toggle="dropdown">'.Yii::app()->user->name.'<b class="caret"></b></a>
					<ul class="dropdown-menu">';
		
		if (!empty(Yii::app()->user->id))
		{
				$userMenu=$userMenu.'<li><a href="'.(Yii::app()->request->baseUrl).'/site/modifypage">个人信息修改</a></li>
						<li><a href="'.(Yii::app()->request->baseUrl).'/site/logout">登出</a></li>';
		}
		$userMenu=$userMenu.'</ul>
								</li>
							 </ul>';
		
		$menuEnd='</ul>';
		if (!empty(Yii::app()->user->id))
		{
			$menu=$menuHead.$messageMenu.$menuEnd.$userMenu;
			$priv=User::model()->findByPk(Yii::app()->user->id);
			if (!empty($priv))
			{
				$priv=$priv->privilege;
				if ($priv==2)
					$menu=$menuHead.$messageMenu.$menuEnd.$userMenu;
				if ($priv==3)
					$menu=$menuHead.$messageMenu.$systemMenu.$menuEnd.$userMenu;
			}
		}
		return $menu;
	}
	
	
	public function getRankList($sid)
	{
		$rank=array('1st','2nd','3rd');
		$criteria = new CDbCriteria;
		$criteria->addCondition('sudoku_id='.$sid);
		$criteria->order = "time ASC";
		$criteria->limit = "3";
		
		$top=Runs::model()->findAll($criteria);
		
		$list='<div class="container" style="width: 200px;position: fixed;top: 150px;right: 0px;">
				<div class="jumbotron" style="width: 200px;margin:0;padding:0;">
				<h3 style="text-align:center;">Top Player</h3>
				<table class="table table-hover">
					<tr>
						<td> </td>
						<td>名字</td>
						<td>时间</td>
					</tr>';
		for ($i=0,$len=count($top);$i<$len;$i++)
		{
			$list.='<tr><td>'.($rank[$i]).'</td><td>'.($top[$i]->user->name).'</td><td>'.($top[$i]->time).'</td></tr>';
		}
		if (count($top)==0)
		{
			$list.='<tr><td colspan="3" style="text-align:center">Top One在等你</td></tr>';
		}
		$list.='</table>
					</div>
				</div>	';
		return $list;
	}
	
	public function getSudoku($sid)
	{
		$sudoku=Sudoku::model()->findByPk($sid);
		if (empty($sudoku))
		{
			$this->redirect(array('sudoku/index'));
		}
		$init=$sudoku->init;
		$grid='<input id="sudoku_id" name="sudoku_id" value="'.($sid).'" style="display:none"/><table class="sudoku-table">';
		for ($h=0;$h<3;$h++)
		{
			$grid.='<tr>';
			for ($i=0;$i<3;$i++)
			{
				$grid.='<td style="padding:0";><table class="table table-bordered" style="margin-bottom:0px;">';
				for ($j=0;$j<3;$j++)
				{
					$grid.='<tr>';
					for ($k=0;$k<3;$k++)
					{
						$grid.=$init[(((($h*3)+$i)*3)+$j)*3+$k]==0?'<td class="sudoku-td" id=T'.((((($h*3)+$i)*3)+$j)*3+$k).'T></td>':'<td class="sudoku-td-init"id=T'.((((($h*3)+$i)*3)+$j)*3+$k).'T>'.$init[(((($h*3)+$i)*3)+$j)*3+$k].'</td>';
					}
					$grid.='</tr>';
				}
				$grid.='</table></td>';
			}
			$grid.='</tr>';
		}
		$grid.='</table>';
		echo $grid;
	}
	
	public function actionGetSudokuCheck($sid,$content)
	{
		$sudoku=Sudoku::model()->findByPk($sid);
		if (empty($sudoku))
		{
			echo 'false';
		}else{
			if ($sudoku->finish==$content)
			{
				echo 'true';
			}else{
				echo 'false';
			}
		}
	}
	
	public function getEditSudoku($sid)
	{
		$sudoku=Sudoku::model()->findByPk($sid);
		if (empty($sudoku))
		{
			$this->redirect(array('sudoku/index'));
		}
		$init=$sudoku->init;
		$grid='<table class="sudoku-table">';
		for ($h=0;$h<3;$h++)
		{
			$grid.='<tr>';
			for ($i=0;$i<3;$i++)
			{
				$grid.='<td style="padding:0";><table class="table table-bordered" style="margin-bottom:0px;">';
				for ($j=0;$j<3;$j++)
				{
					$grid.='<tr>';
					for ($k=0;$k<3;$k++)
					{
						$grid.=$init[(((($h*3)+$i)*3)+$j)*3+$k]==0?'<td class="sudoku-td" id=T'.((((($h*3)+$i)*3)+$j)*3+$k).'T></td>':'<td class="sudoku-td"id=T'.((((($h*3)+$i)*3)+$j)*3+$k).'T>'.$init[(((($h*3)+$i)*3)+$j)*3+$k].'</td>';
					}
					$grid.='</tr>';
				}
				$grid.='</table></td>';
			}
			$grid.='</tr>';
		}
		$grid.='</table>';
		echo $grid;
	}
	
	public function actionGetNowSudokuSolve()
	{
		$sudoku=$_GET['sudoku'];
		$res=$this->solveSudoku($sudoku);
		$grid='<table class="sudoku-table">';
		for ($h=0;$h<3;$h++)
		{
			$grid.='<tr>';
			for ($i=0;$i<3;$i++)
			{
				$grid.='<td style="padding:0";><table class="table table-bordered" style="margin-bottom:0px;">';
				for ($j=0;$j<3;$j++)
				{
					$grid.='<tr>';
					for ($k=0;$k<3;$k++)
					{
						$grid.='<td class="sudoku-td" id="T'.((((($h*3)+$i)*3)+$j)*3+$k).'T">';
						//$grid.=$init[(((($h*3)+$i)*3)+$j)*3+$k]==0?'':$init[(((($h*3)+$i)*3)+$j)*3+$k];
						$grid.=implode(',', $res[(((($h*3)+$i)*3)+$j)*3+$k]);
						$grid.='</td>';
					}
					$grid.='</tr>';
				}
				$grid.='</table></td>';
			}
			$grid.='</tr>';
		}
		$grid.='</table>';
		echo $grid;
	}
	
	public function getNewSudoku()
	{
		$grid='<table class="sudoku-table">';
		for ($h=0;$h<3;$h++)
		{
			$grid.='<tr>';
			for ($i=0;$i<3;$i++)
			{
				$grid.='<td style="padding:0";><table class="table table-bordered" style="margin-bottom:0px;">';
				for ($j=0;$j<3;$j++)
				{
					$grid.='<tr>';
					for ($k=0;$k<3;$k++)
					{
						$grid.='<td class="sudoku-td" id=T'.((((($h*3)+$i)*3)+$j)*3+$k).'T>';
						$grid.='';
						$grid.='</td>';
					}
					$grid.='</tr>';
				}
				$grid.='</table></td>';
			}
			$grid.='</tr>';
		}
		$grid.='</table>';
		echo $grid;
	}
	
	public function actionAddNewSudoku()
	{
		if (empty($_POST['name'])||empty($_POST['content']))
		{
			$this->render('error', array('error'=>('Oops~网络出错了')));
		}
		$sudoku=new Sudoku;
		$sudoku->info=$_POST['name'];
		$sudoku->init=$_POST['content'];
		$sudoku->finish=$_POST['content'];
		$sudoku->status=1;
		
		if ($sudoku->save()>0)
		{
			$this->render('sudokumanagepage');
		}else{
			$this->render('error', array('error'=>('保存出错了')));
		}
	}
	
	public function actionEditSudoku()
	{
		if (empty($_POST['sid'])||empty($_POST['name'])||empty($_POST['content']))
		{
			$this->render('error', array('error'=>('Oops~网络出错了')));
		}
		$sudoku=Sudoku::model()->findByPk($_POST['sid']);
		$sudoku->info=$_POST['name'];
		$sudoku->init=$_POST['content'];
		$sudoku->finish=$_POST['content'];
		$sudoku->status=1;
		
		if ($sudoku->save()>0)
		{
			$this->redirect(array('sudoku/sudokumanagepage'));
		}else{
			$this->render('error', array('error'=>('保存出错了')));
		}
	}
	
	public function actionDeleteSudoku($sid)
	{
		$sudoku=Sudoku::model()->findByPk($sid);
		if (empty($sudoku))
			$this->render('error', array('error'=>('出错了')));
		if ($sudoku->delete()>0)
		{
			$this->redirect(array('sudoku/sudokumanagepage'));
		}else{
			$this->render('error', array('error'=>('出错了')));
		}
	}
	
	public function getNum()
	{
		$grid='<table class="table table-bordered" style="num">';
		for ($i=0;$i<3;$i++)
		{
			$grid.='<tr>';
			for ($j=0;$j<3;$j++)
			{
				$grid.='<td class="input-td"><h3 style="margin:0">'.($i*3+$j+1).'</h3></td>';
			}
			$grid.='</tr>';
		}
		$grid.='</table>';
		echo $grid;
	}
	
	public function actionGetTypifySudoku($type)
	{
		$randomSudoku='000000000000000000000000000000000000000000000000000000000000000000000000000000000';
		for ($i=1;$i<=9;)
		{
			$r=rand(0,80);
			if ($randomSudoku[$r]=='0')
			{
				$randomSudoku[$r]=$i;
				$i++;
			}
		}
		$typeArray='';
		switch ($type)
		{
			case 0:
				$typeArray='000000000000000000000000000000000000000000000000000000000000000000000000000000000';
				$rc=rand(20,30);
				for ($i=0;$i<=$rc;)
				{
					$r=rand(0,80);
					if ($typeArray[$r]=='0')
					{
						$typeArray[$r]=1;
						$i++;
					}
				}
				break;
			case 1:
				$typeArray='000001010000000101000100010100010001010000000001010100000000000101010000000000000';
				break;
			case 2:
				$typeArray='100010005000000000001010100000000000101010101000000000001010100000000000100010001';
				break;
			case 3:
				$typeArray='000011010000111101000110010011010010000000111110020030030011000101111000010110000';
				break;
			default:
				$typeArray='000000000000000000000000000000000000000000000000000000000000000000000000000000000';
				$rc=rand(20,30);
				for ($i=0;$i<=$rc;)
				{
					$r=rand(0,80);
					if ($typeArray[$r]=='0')
					{
						$typeArray[$r]=1;
						$i++;
					}
				}
				break;
		}
		$res=$this->solveSudoku($randomSudoku);
		for ($i=0;$i<81;$i++)
		{
			$res[$i]=$typeArray[$i]==0?'0':$res[$i];
		}
		$grid='<table class="sudoku-table">';
		for ($h=0;$h<3;$h++)
		{
			$grid.='<tr>';
			for ($i=0;$i<3;$i++)
			{
				$grid.='<td style="padding:0";><table class="table table-bordered" style="margin-bottom:0px;">';
				for ($j=0;$j<3;$j++)
				{
					$grid.='<tr>';
					for ($k=0;$k<3;$k++)
					{
						$grid.='<td class="sudoku-td" id="T'.((((($h*3)+$i)*3)+$j)*3+$k).'T">';
						//$grid.=$init[(((($h*3)+$i)*3)+$j)*3+$k]==0?'':$init[(((($h*3)+$i)*3)+$j)*3+$k];
						$grid.=$res[(((($h*3)+$i)*3)+$j)*3+$k]==0?'':implode(',', $res[(((($h*3)+$i)*3)+$j)*3+$k]);
						$grid.='</td>';
					}
					$grid.='</tr>';
				}
				$grid.='</table></td>';
			}
			$grid.='</tr>';
		}
		$grid.='</table>';
		echo $grid;
	}
	
	public function actionTrySudoku()
	{
		$this->pageTitle ="Try Sudoku";
		$this->render('trysudoku');
	}
	
	public function getRandomSudoku()
	{
		$list=Sudoku::model()->findAll();
		$r=rand(0,count($list)-1);
		$this->getSudoku($list[$r]->sudoku_id);
	}
	
	public function actionRandomgame()
	{
		$this->pageTitle ="Random Game!";
		$this->render('randomgame');
	}
	
	public function actionSudokumanagePage()
	{
		$this->pageTitle ="数独管理";
		$this->render('sudokumanagepage');
	}
	
	public function actionAddsudokuPage()
	{
		$this->render('addsudokupage');
	}
	
	public function actionSudokulistPage()
	{
		$this->render('sudokulistpage');
	}
	
	public function actionViewSudoku()
	{
		$this->render('viewsudoku');
	}
	
	public function actionEditSudokuPage()
	{
		$this->render('editsudokupage');
	}
	
	public function initSudoku($input)
	{
		$Result=array();
		$Result[0][0]=$input[0];
		$Result[0][1]=$input[1];
		$Result[0][2]=$input[2];
		$Result[0][3]=$input[9];
		$Result[0][4]=$input[10];
		$Result[0][5]=$input[11];
		$Result[0][6]=$input[18];
		$Result[0][7]=$input[19];
		$Result[0][8]=$input[20];
		$Result[1][0]=$input[3];
		$Result[1][1]=$input[4];
		$Result[1][2]=$input[5];
		$Result[1][3]=$input[12];
		$Result[1][4]=$input[13];
		$Result[1][5]=$input[14];
		$Result[1][6]=$input[21];
		$Result[1][7]=$input[22];
		$Result[1][8]=$input[23];
		$Result[2][0]=$input[6];
		$Result[2][1]=$input[7];
		$Result[2][2]=$input[8];
		$Result[2][3]=$input[15];
		$Result[2][4]=$input[16];
		$Result[2][5]=$input[17];
		$Result[2][6]=$input[24];
		$Result[2][7]=$input[25];
		$Result[2][8]=$input[26];
		$Result[3][0]=$input[27];
		$Result[3][1]=$input[28];
		$Result[3][2]=$input[29];
		$Result[3][3]=$input[36];
		$Result[3][4]=$input[37];
		$Result[3][5]=$input[38];
		$Result[3][6]=$input[45];
		$Result[3][7]=$input[46];
		$Result[3][8]=$input[47];
		$Result[4][0]=$input[30];
		$Result[4][1]=$input[31];
		$Result[4][2]=$input[32];
		$Result[4][3]=$input[39];
		$Result[4][4]=$input[40];
		$Result[4][5]=$input[41];
		$Result[4][6]=$input[48];
		$Result[4][7]=$input[49];
		$Result[4][8]=$input[50];
		$Result[5][0]=$input[33];
		$Result[5][1]=$input[34];
		$Result[5][2]=$input[35];
		$Result[5][3]=$input[42];
		$Result[5][4]=$input[43];
		$Result[5][5]=$input[44];
		$Result[5][6]=$input[51];
		$Result[5][7]=$input[52];
		$Result[5][8]=$input[53];
		$Result[6][0]=$input[54];
		$Result[6][1]=$input[55];
		$Result[6][2]=$input[56];
		$Result[6][3]=$input[63];
		$Result[6][4]=$input[64];
		$Result[6][5]=$input[65];
		$Result[6][6]=$input[72];
		$Result[6][7]=$input[73];
		$Result[6][8]=$input[74];
		$Result[7][0]=$input[57];
		$Result[7][1]=$input[58];
		$Result[7][2]=$input[59];
		$Result[7][3]=$input[66];
		$Result[7][4]=$input[67];
		$Result[7][5]=$input[68];
		$Result[7][6]=$input[75];
		$Result[7][7]=$input[76];
		$Result[7][8]=$input[77];
		$Result[8][0]=$input[60];
		$Result[8][1]=$input[61];
		$Result[8][2]=$input[62];
		$Result[8][3]=$input[69];
		$Result[8][4]=$input[70];
		$Result[8][5]=$input[71];
		$Result[8][6]=$input[78];
		$Result[8][7]=$input[79];
		$Result[8][8]=$input[80];
		return $Result;
	}
	
	public function outputSudoku($Result)
	{
		$output=array();
		$output[0]=$Result[0][0];
		$output[1]=$Result[0][1];
		$output[2]=$Result[0][2];
		$output[9]=$Result[0][3];
		$output[10]=$Result[0][4];
		$output[11]=$Result[0][5];
		$output[18]=$Result[0][6];
		$output[19]=$Result[0][7];
		$output[20]=$Result[0][8];
		$output[3]=$Result[1][0];
		$output[4]=$Result[1][1];
		$output[5]=$Result[1][2];
		$output[12]=$Result[1][3];
		$output[13]=$Result[1][4];
		$output[14]=$Result[1][5];
		$output[21]=$Result[1][6];
		$output[22]=$Result[1][7];
		$output[23]=$Result[1][8];
		$output[6]=$Result[2][0];
		$output[7]=$Result[2][1];
		$output[8]=$Result[2][2];
		$output[15]=$Result[2][3];
		$output[16]=$Result[2][4];
		$output[17]=$Result[2][5];
		$output[24]=$Result[2][6];
		$output[25]=$Result[2][7];
		$output[26]=$Result[2][8];
		$output[27]=$Result[3][0];
		$output[28]=$Result[3][1];
		$output[29]=$Result[3][2];
		$output[36]=$Result[3][3];
		$output[37]=$Result[3][4];
		$output[38]=$Result[3][5];
		$output[45]=$Result[3][6];
		$output[46]=$Result[3][7];
		$output[47]=$Result[3][8];
		$output[30]=$Result[4][0];
		$output[31]=$Result[4][1];
		$output[32]=$Result[4][2];
		$output[39]=$Result[4][3];
		$output[40]=$Result[4][4];
		$output[41]=$Result[4][5];
		$output[48]=$Result[4][6];
		$output[49]=$Result[4][7];
		$output[50]=$Result[4][8];
		$output[33]=$Result[5][0];
		$output[34]=$Result[5][1];
		$output[35]=$Result[5][2];
		$output[42]=$Result[5][3];
		$output[43]=$Result[5][4];
		$output[44]=$Result[5][5];
		$output[51]=$Result[5][6];
		$output[52]=$Result[5][7];
		$output[53]=$Result[5][8];
		$output[54]=$Result[6][0];
		$output[55]=$Result[6][1];
		$output[56]=$Result[6][2];
		$output[63]=$Result[6][3];
		$output[64]=$Result[6][4];
		$output[65]=$Result[6][5];
		$output[72]=$Result[6][6];
		$output[73]=$Result[6][7];
		$output[74]=$Result[6][8];
		$output[57]=$Result[7][0];
		$output[58]=$Result[7][1];
		$output[59]=$Result[7][2];
		$output[66]=$Result[7][3];
		$output[67]=$Result[7][4];
		$output[68]=$Result[7][5];
		$output[75]=$Result[7][6];
		$output[76]=$Result[7][7];
		$output[77]=$Result[7][8];
		$output[60]=$Result[8][0];
		$output[61]=$Result[8][1];
		$output[62]=$Result[8][2];
		$output[69]=$Result[8][3];
		$output[70]=$Result[8][4];
		$output[71]=$Result[8][5];
		$output[78]=$Result[8][6];
		$output[79]=$Result[8][7];
		$output[80]=$Result[8][8];
		return $output;
	}
	
	public function solveSudoku($sudoku)
	{
		//solve it
		$sudoku=$this->initSudoku($sudoku);
		$sd=new SudokuSolve;
		return $this->outputSudoku($sd->calc($sudoku));
	}
	
	public function actionSolve()
	{
		$this->render("solve");
	}
	
	public function GetSudokuList()
	{
		$list='<table class="table table-hover">
				<tr>
					<td>#</td>
					<td>名字</td>
			    </tr>';
		$sudokuList=Sudoku::model()->findAll();
		for ($i=0,$len=count($sudokuList);$i<$len;$i++)
		{
			$list.='<tr><td>'.($i+1).'</td>'
					.'<td><a href="'.(Yii::app()->baseURL).'/sudoku/viewsudoku?sid='.($sudokuList[$i]->sudoku_id).'">'.$sudokuList[$i]->info.'</a></td></tr>';
		}
		$list.='</table>';
		echo $list;
	}
	
	public function GetSudokuManageList()
	{
		$list='<table class="table table-hover">
				<tr>
					<td>#</td>
					<td>名字</td>
					<td>删除</td>
			    </tr>';
		$sudokuList=Sudoku::model()->findAll();
		for ($i=0,$len=count($sudokuList);$i<$len;$i++)
		{
			$list.='<tr><td>'.($sudokuList[$i]->sudoku_id).'</td>'
					.'<td><a href="'.(Yii::app()->baseURL).'/sudoku/editsudokupage?sid='.($sudokuList[$i]->sudoku_id).'">'.$sudokuList[$i]->info.'</a></td>'
					.'<td><div class="btn-group">
						  <button type="button" class="btn btn-danger dropdown-toggle" data-toggle="dropdown">
							删除<span class="caret"></span>
							<span class="sr-only">Toggle Dropdown</span>
						  </button>
						  <ul class="dropdown-menu" style="min-width:0px;padding:0 0 0 0;" role="menu">
							<li><a href="'.(Yii::app()->baseURL).'/sudoku/deletesudoku?sid='.($sudokuList[$i]->sudoku_id).'">确定</a></li>
						  </ul>
						</div>
					</td>';
		}
		$list.='</table>';
		echo $list;
	}
	
	public function actionFighting()
	{
		$list=Runs::model()->findByAttributes(array('user_id'=>Yii::app()->user->id,'status'=>0));
		if (!empty($list))
		{
			$this->render('fighting');
		}else{
			$this->render('index');
		}
	}
	
}